package controller

import (
	"errors"
	"fmt"
	"github.com/gin-gonic/gin"
	"go_web/dao/mysql"
	"go_web/models"
	"go_web/utils"
	"net/http"
)

//对用户的身份进行校验
func JWTHandler(ctx *gin.Context) {
	//1.获取前端参数并直接绑定到后端的数据结构上
	var user *models.User

	err := ctx.ShouldBind(&user)
	//如果绑定出差的话，执行下面
	if err != nil {
		ctx.JSON(http.StatusOK, gin.H{
			"code": "2001",
			"msg":  "参数有误",
		})
		return //结束
	}

	//2.对用户的身份进行校验
	if user.UserName == "archme" && user.PassWord == "archme" {

		//当用户的用户名和密码验证通过后，直接生成token
		tokenStr, _ := utils.GenToken(user.UserId)
		ctx.JSON(http.StatusOK, gin.H{
			"code": "2000",
			"msg":  "success",
			"data": gin.H{"token": tokenStr},
		})
		return
	}

	//3.当用户身份验证未通过，直接返回鉴权未通过
	ctx.JSON(http.StatusOK, gin.H{
		"code": "2002",
		"msg":  "用户鉴权未通过",
	})
}

//  /login的登陆业务代码
func LoginHandler(ctx *gin.Context) {
	//第一步是对用户名进行校验

	//创建一个User实例
	var user models.User
	//将传入的参数绑定到user实例上
	if err := ctx.ShouldBindJSON(&user); err != nil {
		fmt.Println(err)
		ResponseError(ctx, CodeInvalidParams)
		return
	}
	//若是以上通过了，那么接下来就可以对密码进行校验
	//用户登陆的时候传入的参数长度的校验
	if ok, errMsg := user.LoginValidate(); !ok {
		fmt.Println(errMsg)
		ResponseErrorWithMsg(ctx, CodeInvalidParams, errMsg)
		return
	}

	//用户传入的用户、密码
	if err := mysql.Login(&user); err != nil {
		fmt.Println(err)
		ResponseError(ctx, CodeInvalidPassword)
		return
	}
	ResponseSuccess(ctx, nil)
}

//   /register 注册的业务逻辑
func RegisterHandler(ctx *gin.Context) {
	//1.获取参数
	var r *models.RegisterForm
	//将获取到的前端参数绑定到RegisterForm结构体实例上
	if err := ctx.ShouldBindJSON(&r); err != nil {
		ctx.JSON(http.StatusOK, gin.H{
			"code": CodeSuccess,
			"msg":  GetMsg(CodeSuccess),
		})
		return
	}

	//2.校验参数,此处校验的主要是注册时的用户名和密码的长度
	if ok, errMsg := r.Validate(); !ok {
		ctx.JSON(http.StatusOK, gin.H{
			"code": CodeInvalidParams,
			"msg":  errMsg,
		})
		return
	}

	//3.注册用户(将用户名和密码存储到数据库中)
	err := mysql.Register(&models.User{
		UserName: r.UserName,
		PassWord: r.PassWord,
	})

	//如果用户已经在数据库中存在，会报错的
	if errors.Is(err, mysql.ErrorUserExit) {
		ResponseError(ctx, CodeUserExist)
		return
	}

	//当用户在数据库中已经存在的话，此处会报错的
	if err != nil {
		ResponseError(ctx, CodeServerBusy)
		return
	}

	//当上面的步骤都未报错，那么就表示注册成功
	ResponseSuccess(ctx, nil)
}
